/****************************************************************************\
 * @file     BR_Action.h
 * @author   傅帅
 * @date     2019/12/26
 * @brief    动作管理任务
 * @note     如此封装并规定参数类型是为了实现Console在线调参
 ******************************************************************************
 * @note  使用示例：
            创建动作：   BR_ActionHandler_t my_action;
                        uint8_t par_num = 3;
                        my_action = BR_xActionCreate("my_action_name", par_num, my_action_func);

                        void my_action_func(float *pPars){
                            float arg1 = *pPars, arg2 = *(pPars+1), arg3 = *(pPars+2);
                            // Do Something
                        }

            触发动作：   float arg1 = 1.1, arg2 = 2.2, arg3 = 3.3;
                        BR_vActionTrigger(my_action, arg1, arg2, arg3);
 ****************************************************************************/

#include <stdarg.h>
#include "FreeRTOS.h"
#include "BR_Config.h"

#ifndef BR_ACTION_MANAGER_H
#define BR_ACTION_MANAGER_H

typedef struct _BR_Action_t {
    char *ActionName;                       // 动作名称
    uint8_t ActionParNum;                   // 参数数目
    float *pParsBuffer;                     // 存参数
    void ( * ActionFunc )(float *pPars);    // 取参数时*pPars往后找
}BR_Action_t;
typedef BR_Action_t* BR_ActionHandler_t;

BR_ActionHandler_t BR_xActionCreate(char *ActionName, uint8_t ActionParNum, void ( * ActionFunc )(float *pPars));
void BR_vActionTrigger(BR_ActionHandler_t Action, ...);

extern BR_Action_t BR_ActionTbl[BR_configMAX_ACT_NUM];
extern uint8_t BR_ActionNum;

#endif
